
 1000  *---------------------------------
 1010  *      STAND-ALONE RANDOM FUNCTION
 1020  *      ---------------------------
 1030  *
 1040  *      GET A RANDOM NUMBER BETWEEN 0 AND X-1
 1050  *
 1060  *      CALL:  VALUE X IN Y- AND A-REGISTERS
 1070  *             JSR RANDOM
 1080  *    RETURN:  RANDOM NUMBER IN Y- AND A-REGISTERS
 1090  *             LO-BYTE IN Y, HI-BYTE IN A
 1100  *---------------------------------
 1110  MON.RNDL   .EQ $4E
 1120  MON.RNDH   .EQ $4F
 1130  MON.PRBYTE .EQ $FDDA
 1140  MON.COUT   .EQ $FDED
 1150  *---------------------------------
 1160  RANDOM LDA MON.RNDH GET SEED HI-BYTE
 1170         BNE .1       BE SURE SEED BTWN 1 AND 7FFF
 1180         CMP MON.RNDL SET CARRY IF BOTH BYTES ZERO
 1190         ADC #0       CHANGE 0000 TO 0100
 1200  .1     AND #$7F     MAKE SURE NOT LARGER THAN 7FFF
 1210         STA MON.RNDH
 1220         STA VALUE+1
 1230         LDA MON.RNDL
 1240         STA VALUE
 1250  *---------------------------------
 1260         LDY #17      LOOP TO MAKE NEXT RANDOM VALUE
 1270  .2     LDA MON.RNDH (WOZNIAK'S ALGORITHM)
 1280         ASL
 1290         CLC
 1300         ADC #$40
 1310         ASL
 1320         ROL MON.RNDL
 1330         ROL MON.RNDH
 1340         DEY
 1350         BNE .2
 1360  *---------------------------------
 1370         RTS
 1380  *---------------------------------
 1390  LIMIT  .BS 2
 1400  VALUE  .BS 2
 1410  *---------------------------------
 1420  TEST.RANDOM
 1430         LDA #0
 1440         STA COUNT
 1450         STA COUNT+1
 1460         STA MON.RNDL
 1465         INC MON.RNDL
 1470         STA MON.RNDH
 1480  TSTLP  JSR RANDOM
 1490         LDA VALUE
 1500         STA LOBYAD
 1510         LDA VALUE+1
 1520         ADC #$10
 1530         STA HIBYAD
 1550         INC $FFFF
 1551  LOBYAD .EQ *-2
 1552  HIBYAD .EQ *-1
 1560         INC COUNT
 1570         BNE TSTLP
 1580         INC COUNT+1
 1590         BPL TSTLP
 1600         RTS
 1610  *---------------------------------
 1620  COUNT  .BS 2

